O(n)时间解决的面试题:二进制矩阵中1的个数
问题描述
给定n*n的01方阵,每一行都是降序排列,即先前的一段一定是1,到10分界处之后才是全0,求1最多的那行中1的个数
分析问题
如果数出每一行1的个数,然后再看哪一行1的个数最多,这样时间复杂度是O(n^2)
如果用二分法优化,可以找出每一行0和1的分界处,然后就知道了每一行的1的个数,时间复杂度为nlogn
还有一种时间复杂度为n的方法,算法的策略师如果某个位置是1,那么向右走,如果是0,则向下走,这样的策略使得我们能够遍历到最优解,这个思想也是我们不需要遍历所有的可行域,只需要我们遍历的过程一定能够扫过最优解即可
算法实现
int sol(vector<vector<char>> &a){
int n= a.size();
int best=0;
for(int i=0;(best<n)&&(i<n);++i){
//当当前元素也即a[i][best]等于1时,让best++,如果不是,则让i++
while((best<n)a[i][best]==1) ++best;
}
return best;
}